//
//  YHSelfSizingView.swift
//  YHKit
//
//  Created by amovision on 2025/9/28.
//

import UIKit

/**
 * 一个可以根据其内部 Auto Layout 约束自动计算并调整自身尺寸的 UIView 基类。
 *
 * 使用方法:
 * 1. 让你的自定义视图继承自 SelfSizingView。
 * 2. 在你的自定义视图内部，添加子视图并设置从上到下完整的 Auto Layout 约束。
 * 3. 将这个自定义视图添加到父视图中，通常只需要设置水平方向的约束（如 leading/trailing/centerX）和顶部的约束（top）。
 * **不要**为它设置高度约束，它的高度将自动计算。
 * 4. 当视图内部的内容发生变化（例如，UILabel 的文本更新）并可能影响其高度时，
 * 在更新内容后，请务必调用该视图的 `invalidateIntrinsicContentSize()` 方法来触发重新布局。
 */
class SelfSizingView: UIView {

    // 重写 intrinsicContentSize 属性
    // 这是 Auto Layout 系统查询视图“自然”尺寸的地方
    override var intrinsicContentSize: CGSize {
        // 使用 systemLayoutSizeFitting 来计算满足所有内部约束所需的最小尺寸。
        // 我们通常关心的是高度，宽度会由父视图的约束（例如 leading 和 trailing）来决定。
        // layoutFittingCompressedSize 表示“尽可能小的尺寸”。
        return systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
    }

    // 当这个视图的 intrinsicContentSize 无效时，
    // layoutSubviews 会被触发，我们在这里也通知父视图需要更新布局。
    override func layoutSubviews() {
        super.layoutSubviews()
        // 确保在尺寸变化时，父视图也能正确布局
        superview?.layoutIfNeeded()
    }
}
